home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TeX 1995 July
/
TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO
/
dviware
/
crudetype
/
version3
/
w2c.lex
< prev
next >
Wrap
Text File
|
1991-11-28
|
5KB
|
174 lines
%{
#include "w2c.h"
#include "w2cy.h"
#ifdef ANSI
int yylex(void);
#ifndef BSD
static void unput(char);
static int input(void);
#endif
#endif
char conditional[20], negbuf[2], temp[20];
extern boolean doing_statements;
%}
DIGIT [0-9]
ALPHA [a-zA-Z]
ALPHANUM ({DIGIT}|{ALPHA})
IDENTIFIER ({ALPHA}{ALPHANUM}*)
NUMBER ({DIGIT}+)
SIGN ("+"|"-")
SIGNED ({SIGN}?{NUMBER})
WHITE [ \n\t]+
REAL ({NUMBER}"."{NUMBER}("e"{SIGNED})?)|({NUMBER}"e"{SIGNED})
COMMENT (("{"[^}]*"}")|("(*"([^*]|"*"[^)])*"*)"))
W ({WHITE}|"packed")+
WW ({WHITE}|{COMMENT}|"packed")*
HHB0 ("hh"{WW}"."{WW}"b0")
HHB1 ("hh"{WW}"."{WW}"b1")
%%
{W} ;
"{" {while (input() != '}');
}
"#" {
register int c;
(void) putc('#', std);
while ((c = input()) && c != ';')
(void) putc(c, std);
(void) putc('\n', std);
}
"ifdef(" {register int c;
register char *cp=conditional;
new_line();
(void) input();
while ((c = input()) != '\'')
#ifdef MS_DOS
*cp++ = (char) c;
#else
*cp++ = c;
#endif
*cp = '\0';
(void) input();
if (doing_statements) fputs("\t;\n", std);
(void) fprintf(std,
"#ifdef %s\n", conditional);
}
"endif(" {register int c;
new_line();
fputs("#endif /* ", std);
(void) input();
while ((c = input()) != '\'')
(void) putc(c, std);
(void) input();
conditional[0] = '\0';
fputs(" */\n", std);
}
"forward" return(last_tok=forward_tok) ;
"external" return(last_tok=extern_tok) ;
"@define" return(last_tok=define_tok);
"@field" return(last_tok=field_tok);
"and" return(last_tok=and_tok) ;
"array" return(last_tok=array_tok) ;
"begin" return(last_tok=begin_tok) ;
"case" return(last_tok=case_tok) ;
"const" return(last_tok=const_tok) ;
"div" return(last_tok=div_tok) ;
"break" return(last_tok=break_tok);
"do" return(last_tok=do_tok) ;
"downto" return(last_tok=downto_tok) ;
"else" return(last_tok=else_tok) ;
"end" return(last_tok=end_tok) ;
"file" return(last_tok=file_tok) ;
"for" return(last_tok=for_tok) ;
"function" return(last_tok=function_tok) ;
"goto" return(last_tok=goto_tok) ;
"if" return(last_tok=if_tok) ;
"label" return(last_tok=label_tok) ;
"mod" return(last_tok=mod_tok) ;
"not" return(last_tok=not_tok) ;
"of" return(last_tok=of_tok) ;
"or" return(last_tok=or_tok) ;
"procedure" return(last_tok=procedure_tok) ;
"program" return(last_tok=program_tok) ;
"record" return(last_tok=record_tok) ;
"repeat" return(last_tok=repeat_tok) ;
{HHB0} return(last_tok=hhb0_tok) ;
{HHB1} return(last_tok=hhb1_tok) ;
"then" return(last_tok=then_tok) ;
"to" return(last_tok=to_tok) ;
"type" return(last_tok=type_tok) ;
"until" return(last_tok=until_tok) ;
"var" return(last_tok=var_tok) ;
"with" return(last_tok=with_tok) ;
"new" return(last_tok=new_tok) ;
"while" return(last_tok=while_tok) ;
"others" return(last_tok=others_tok) ;
"write" return(last_tok=write_tok) ;
"writeln" return(last_tok=writeln_tok) ;
{REAL} {
(void) sprintf(temp, "%s%s", negbuf, yytext);
negbuf[0] = '\0';
return(last_tok=r_num_tok) ;
}
{NUMBER} {
(void) sprintf(temp, "%s%s", negbuf, yytext);
negbuf[0] = '\0';
return(last_tok=i_num_tok) ;
}
("'"([^']|"''")"'") return(last_tok=single_char_tok) ;
("'"([^']|"''")*"'") return(last_tok=string_literal_tok) ;
"+" { if ((last_tok>=undef_id_tok &&
last_tok<=field_id_tok) ||
last_tok==i_num_tok ||
last_tok==r_num_tok ||
last_tok==')' ||
last_tok==']')
return(last_tok='+') ;
else return(last_tok=unary_plus_tok) ; }
"-" { if ((last_tok>=undef_id_tok &&
last_tok<=field_id_tok) ||
last_tok==i_num_tok ||
last_tok==r_num_tok ||
last_tok==')' ||
last_tok==']')
return(last_tok='-') ;
else {
int c;
while ((c = input()) == ' ' || c == '\t');
#ifdef MS_DOS
unput((char) c);
#else
unput(c);
#endif
if (c < '0' || c > '9') {
return(last_tok = unary_minus_tok);
}
negbuf[0] = '-';
}}
"*" return(last_tok='*') ;
"/" return(last_tok='/') ;
"=" return(last_tok='=') ;
"<>" return(last_tok=not_eq_tok) ;
"<" return(last_tok='<') ;
">" return(last_tok='>') ;
"<=" return(last_tok=less_eq_tok) ;
">=" return(last_tok=great_eq_tok) ;
"(" return(last_tok='(') ;
")" return(last_tok=')') ;
"[" return(last_tok='[') ;
"]" return(last_tok=']') ;
":=" return(last_tok=assign_tok) ;
".." return(last_tok=two_dots_tok) ;
"." return(last_tok='.') ;
"," return(last_tok=',') ;
";" return(last_tok=';') ;
":" return(last_tok=':') ;
"^" return(last_tok='^') ;
{IDENTIFIER} { (void) strcpy(last_id,yytext) ;
l_s=search_table(last_id) ;
if (l_s) return(last_tok=sym_table[l_s].typ);
else return(last_tok=undef_id_tok);
}
. return(last_tok=unknown_tok) ;
%%